/***************************************************************************************
* Copyright (c) 2014-2022 Zihao Yu, Nanjing University
*
* NEMU is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*          http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
*
* See the Mulan PSL v2 for more details.
***************************************************************************************/

#include <isa.h>
#include <stdlib.h>
#include "local-include/reg.h"

#define PRINT_TWO_REG(i) printf("%s:0x%08x\t%s:0x%08x\n",regs[i],gpr(i),regs[i+1],gpr(i+1))


const char *regs[] = {
  "$0", "ra", "sp", "gp", "tp", "t0", "t1", "t2",
  "s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5",
  "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7",
  "s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6"
};
bool find_reg(const char * str,uint32_t *n){
  int i;
  for(i=0;i<ARRLEN(regs);i++){
    if(strcmp(str,regs[i])==0){
      *n=i;
      return true;
    }
  }
  *n=-1;
  return false;
}

void isa_reg_display() {
  int i;
  setvbuf(stdout, NULL, _IOFBF, 1024);
  for(i=0;i<ARRLEN(regs);i+=2){
    PRINT_TWO_REG(i);
  }
  fflush(stdout);
}

word_t isa_reg_str2val(const char *s, bool *success) {
  int i;
  for(i=0;i<ARRLEN(regs);i++){
    if(strcmp(s,regs[i])==0){
      *success=true;
      return gpr(i);
    }
  }
  *success=false;
  return -1;
}
